Econometria Aplicada à Finanças

Mestrado Profissional em Administração

Prof. Washington Santos da Silva

IFMG - Campus Formiga

1 de outubro de 2024

Tutorial sobre o Pacote dplyr

Descrição

  1. Aprender a usar as seis principais funções de manipulação de datra frames do pacote dplyr:
  • select()
  • filter()
  • group_by()
  • summarize()
  • mutate()
  • arrange()
  1. Aprender a usar o operador pipe (%>%) para combinar essas funções.

Obs. Utilizaremos a sigla df como abreviação de data frame.

Pacotes Necessários

Pacote tidyverse

Metapacote

  • Quando executamos o comando:
library(tidyverse)
  • Os seguintes pacotes são carregados:

readrdplyrtidyrggplot2
forcatsstringrtibblepurrrlubridate

Pacote gapminder

Descrição

  • O pacote gapminder contém uma df chamada gapminder.

  • A df gapminder fornece informações reais e detalhadas sobre indicadores socioeconômicos de vários países ao longo do tempo.

  • Este conjunto de dados é muito utilizado para ilustrar diversas operações de manipualação e análise de dados.

  • Para acessar os dados gapminder, basta instalar e carregar o pacote gapminder:

# após instalar, carregue o pacote
library(gapminder)

Hans Roslings na BBC

Dados: gapminder

Variável Descrição
country nome do país.
continent continente ao qual o país pertence.
year ano da observação.
lifeExp expectativa de vida ao nascer, em anos.
pop população total do país.
gdpPercap PIB per capita, ajustado pelas diferenças de poder de compra

gapminder - visão geral dos dados

# estrutura dos dados
dplyr::glimpse(gapminder)
Rows: 1,704
Columns: 6
$ country   <fct> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", …
$ continent <fct> Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, …
$ year      <int> 1952, 1957, 1962, 1967, 1972, 1977, 1982, 1987, 1992, 1997, …
$ lifeExp   <dbl> 28.801, 30.332, 31.997, 34.020, 36.088, 38.438, 39.854, 40.8…
$ pop       <int> 8425333, 9240934, 10267083, 11537966, 13079460, 14880372, 12…
$ gdpPercap <dbl> 779.4453, 820.8530, 853.1007, 836.1971, 739.9811, 786.1134, …

gapminder - variáveis

# nome das variáveis
names(gapminder)
[1] "country"   "continent" "year"      "lifeExp"   "pop"       "gdpPercap"

gapminder - estatísticas descritivas

# nome das variáveis
summary(gapminder)
        country        continent        year         lifeExp     
 Afghanistan:  12   Africa  :624   Min.   :1952   Min.   :23.60  
 Albania    :  12   Americas:300   1st Qu.:1966   1st Qu.:48.20  
 Algeria    :  12   Asia    :396   Median :1980   Median :60.71  
 Angola     :  12   Europe  :360   Mean   :1980   Mean   :59.47  
 Argentina  :  12   Oceania : 24   3rd Qu.:1993   3rd Qu.:70.85  
 Australia  :  12                  Max.   :2007   Max.   :82.60  
 (Other)    :1632                                                
      pop              gdpPercap       
 Min.   :6.001e+04   Min.   :   241.2  
 1st Qu.:2.794e+06   1st Qu.:  1202.1  
 Median :7.024e+06   Median :  3531.8  
 Mean   :2.960e+07   Mean   :  7215.3  
 3rd Qu.:1.959e+07   3rd Qu.:  9325.5  
 Max.   :1.319e+09   Max.   :113523.1  
                                       

Operador pipe

Operadores pipe em R

Operadores Pipe em R

  • O operador pipe %>% foi introduzido na linguagem R pelo pacote magrittr.

  • Após carregar o pacote tidyverse, o operador %>% estará disponível.

  • A partir da versão R 4.0.0, o operador pipe |> foi introduzido na linguagem base.

  • Vou utilizar o operador mais antigo %>%.

  • Atalho do teclado para inserir: Ctrl + Shift + M

Operador pipe em R

Operadores Pipe em R

  • Em programação, um operador pipe é uma técnica para passar informações de um processo para outro.

  • Vamos programar a seguinte operação usando o operador pipe:

  1. Comece com a data frame gapminder e passe esta df para a função select();

  2. selecione as variáveis country e lifeExp;

  3. organize a df por lifeExp em ordem decrescente.

Operador pipe em R

gapminder %>%                   # passo 1
  select(country, lifeExp) %>%  # passo 2
  arrange(desc(lifeExp))        # passo 3
# A tibble: 1,704 × 2
   country          lifeExp
   <fct>              <dbl>
 1 Japan               82.6
 2 Hong Kong, China    82.2
 3 Japan               82  
 4 Iceland             81.8
 5 Switzerland         81.7
 6 Hong Kong, China    81.5
 7 Australia           81.2
 8 Spain               80.9
 9 Sweden              80.9
10 Israel              80.7
# ℹ 1,694 more rows

Operador pipe em R

  • Muitas vezes, desejamos salvar o resultado das operações realizadas com o operador pipe em um novo objeto.
dados_criados <- gapminder %>%  # passo 1
  select(country, lifeExp) %>%  # passo 2
  arrange(desc(lifeExp))        # passo 3

dados_criados
# A tibble: 1,704 × 2
   country          lifeExp
   <fct>              <dbl>
 1 Japan               82.6
 2 Hong Kong, China    82.2
 3 Japan               82  
 4 Iceland             81.8
 5 Switzerland         81.7
 6 Hong Kong, China    81.5
 7 Australia           81.2
 8 Spain               80.9
 9 Sweden              80.9
10 Israel              80.7
# ℹ 1,694 more rows

Visão Geral do Pacote dplyr

Pacote dplyr

Procedimentos Comuns em Análise de Dados

  • Muitas vezes, para fazer alguma operação, desejamos selecionar somente certas observações (linhas) ou variáveis (colunas) de uma df.

  • Além disso, muitas vezes precisamos agrupar os dados por uma determinada(s) variável(s).

  • E também desejamos calcular estatísticas descritivas para esses subconjuntos de dados.

  • O objetivo do pacote dplyr é facilitar estas operações.

Pacote dplyr

dplyr é muito útil nestas etapas

Pacote dplyr

Vantagens

O pacote dplyr fornece uma série de funções muito úteis para manipular data frames de uma maneira que:

  • o código é mais legível e intuitivo.
  • reduz a repetição.
  • reduz a chance de cometer erros.
  • economiza digitação.

Pacote dplyr

Objetivos de Aprendizagem

  • Vamos aprender 5 das funções mais usadas do pacote dplyr,
Função Descrição
select() para selecionar variáveis (colunas)
filter() para selecionar linhas
group_by() para que as operações sejam realizadas “por grupo”
summarize() calcula estatísticas descritivas
mutate() cria novas variáveis a partir das variáveis existentes
arrange() ordena a df segundo uma variável
  • Além disso, veremos como usar o operador pipe (%>%) para combiná-las.

Funcão select()

Função select()

A função select() seleciona colunas (ou variáveis) de uma df.

Função select()

Exemplo - Seleção por Inclusão

  • Se, por exemplo, quisernos utilizar apenas as variáveis: country e gdpPercap da df gapminder.

  • podemos usar a função select() da seguinte forma:

gapminder %>% 
select(country, gdpPercap)
# A tibble: 1,704 × 2
   country     gdpPercap
   <fct>           <dbl>
 1 Afghanistan      779.
 2 Afghanistan      821.
 3 Afghanistan      853.
 4 Afghanistan      836.
 5 Afghanistan      740.
 6 Afghanistan      786.
 7 Afghanistan      978.
 8 Afghanistan      852.
 9 Afghanistan      649.
10 Afghanistan      635.
# ℹ 1,694 more rows

Função select()

Exemplo - Seleção por Exclusão

  • Se quisermos remover as variáveis continent e pop, podemos usar:
gapminder %>% 
select(-continent, -pop)
# A tibble: 1,704 × 4
   country      year lifeExp gdpPercap
   <fct>       <int>   <dbl>     <dbl>
 1 Afghanistan  1952    28.8      779.
 2 Afghanistan  1957    30.3      821.
 3 Afghanistan  1962    32.0      853.
 4 Afghanistan  1967    34.0      836.
 5 Afghanistan  1972    36.1      740.
 6 Afghanistan  1977    38.4      786.
 7 Afghanistan  1982    39.9      978.
 8 Afghanistan  1987    40.8      852.
 9 Afghanistan  1992    41.7      649.
10 Afghanistan  1997    41.8      635.
# ℹ 1,694 more rows

Função filter()

Função filter()

Essa mensagem indica que há uma funçào interna de mesmo nome. Para resolver o conflito, devemos utilizar dplyr::filter()

Função filter()

Exemplo 1 - Uma condição

Considere que você precisa fazer a seguinte operação

  1. Comece com a data frame gapminder e passe esta df para a função select();

  2. selecione as variáveis country e lifeExp;

  3. Mas você precisa da expectativa de vida somente para países do continente europeu.

Nesse caso você precisa filtrar as linhas correspondentes ao continente europeu.

Função filter() - Exemplo 1

gapminder %>%
    filter(continent == "Europe") %>%
    select(country, lifeExp)
# A tibble: 360 × 2
   country lifeExp
   <fct>     <dbl>
 1 Albania    55.2
 2 Albania    59.3
 3 Albania    64.8
 4 Albania    66.2
 5 Albania    67.7
 6 Albania    68.9
 7 Albania    70.4
 8 Albania    72  
 9 Albania    71.6
10 Albania    73.0
# ℹ 350 more rows

Dica: Operadores Relacionais de R

Operadores Relacionais

  • a == b é um operador relacional que retorna TRUE se a é exatamente igual a b, e FALSE, caso contrário.

  • É importante conhecer os operadodes relacionais de qualquer linguagem:

Tabela 1: Operadores Relacionais da linguagem R
operador significado
a < b a é menor que b?
a <= b a é menor ou igual b?
a > b a é maior que b?
a >= b a é maior ou igual a b?
a == b a é exatamente igual a b?
a != b a é diferente de b?

Função filter() - Exemplo 2

Múltiplas Condições

  • E se agora, você precisa mostrar a expectativa de vida dos países europeus, mas apenas para um ano específico, por exemplo, 2007?
gapminder %>%
  filter(continent == "Europe", year == 2007) %>%
  select(country, lifeExp)
# A tibble: 30 × 2
   country                lifeExp
   <fct>                    <dbl>
 1 Albania                   76.4
 2 Austria                   79.8
 3 Belgium                   79.4
 4 Bosnia and Herzegovina    74.9
 5 Bulgaria                  73.0
 6 Croatia                   75.7
 7 Czech Republic            76.5
 8 Denmark                   78.3
 9 Finland                   79.3
10 France                    80.7
# ℹ 20 more rows

Exemplo 2

Explicação do código

  • Novamente, primeiro passamos a df gapminder para a função filter().

  • Depois passamos a versão filtrada da df gapminder para a função select().

  • A ordem das operações é muito importante neste caso.

  • Se usássemos select() primeiro, a função filter() não seria capaz de encontrar a variável continent, já que a teríamos removido na etapa anterior.

  • Sempre use filter() em primeiro lugar.

Funções group_by() e summarize()

Função group_by()

Motivação

  • Deveríamos estar reduzindo a repetitividade propensa a erros do que pode ser feito com R base, mas até agora não fizemos isso.

  • Pois teríamos que repetir o código anterior para cada continente.

  • Em vez de filter(), que somente passará observações que atendam aos seus critérios (nesse caso: continente=="Europa),

  • Podemos usar group_by(), que essencialmente usará todos os critérios exclusivos que você poderia ter usado no filtro.

Função dplyr::group_by()

Funções group_by() e summarize()

Motivação

  • Usando a função group_by(), dividimos a df original em várias partes,

  • Então podemos usar funções (por exemplo, mean() ou sd()) dentro de summarize(), para calculá-las em cada uma das partes:

Exemplo 1

Agrupando por uma Variável

  • Calcule a renda per capita média por continente.
gapminder %>%
  group_by(continent) %>%
  summarize(renda_percapita_media = mean(gdpPercap))
# A tibble: 5 × 2
  continent renda_percapita_media
  <fct>                     <dbl>
1 Africa                    2194.
2 Americas                  7136.
3 Asia                      7902.
4 Europe                   14469.
5 Oceania                  18622.

Exemplo 2

Agrupando por Diversas Variáveis

  • A função group_by() nos permite agrupar por várias variáveis.

  • Calcule a renda per capita média por continente e por ano.

gapminder %>%
  group_by(continent, year) %>%
  summarize(renda_percapita_media_ano = mean(gdpPercap))
# A tibble: 60 × 3
# Groups:   continent [5]
   continent  year renda_percapita_media_ano
   <fct>     <int>                     <dbl>
 1 Africa     1952                     1253.
 2 Africa     1957                     1385.
 3 Africa     1962                     1598.
 4 Africa     1967                     2050.
 5 Africa     1972                     2340.
 6 Africa     1977                     2586.
 7 Africa     1982                     2482.
 8 Africa     1987                     2283.
 9 Africa     1992                     2282.
10 Africa     1997                     2379.
# ℹ 50 more rows

Exemplo 3

Calculo de Diversas Estatísticas Descritivas

  • Isso já é bastante poderoso, mas fica ainda melhor!

  • Você não está limitado a calcular apenas uma estatística descritiva com summarize().

  • Calcule a renda per capita média e mediana do continente europeu para o ano de 2007.

Exemplo 3

gapminder %>%
  filter(continent == "Europe", year == 2007) %>%
  group_by(continent, year) %>%
  summarize(renda_percapita_media_ano = mean(gdpPercap),
            renda_percapita_mediana_ano = median(gdpPercap)
           )
# A tibble: 1 × 4
# Groups:   continent [1]
  continent  year renda_percapita_media_ano renda_percapita_mediana_ano
  <fct>     <int>                     <dbl>                       <dbl>
1 Europe     2007                    25054.                      28054.

Função mutate()

Função mutate()

A função mutate() do pacote dplyr é usada para adicionar novas variáveis ou modificar variáveis existentes em uma df

Exemplo 1

Calcular o PIB Total

  • Podemos usar mutate() para calcular o Produto Interno Bruto (PIB) total de cada país a partir do PIB per capita (gdpPercap) e da população (pop).

  • Este exemplo cria uma nova coluna pib_total que é o resultado da multiplicação do PIB per capita pela população total do país naquele ano.

gapminder %>%
  mutate(pib_total = gdpPercap*pop)
# A tibble: 1,704 × 7
   country     continent  year lifeExp      pop gdpPercap    pib_total
   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>        <dbl>
 1 Afghanistan Asia       1952    28.8  8425333      779.  6567086330.
 2 Afghanistan Asia       1957    30.3  9240934      821.  7585448670.
 3 Afghanistan Asia       1962    32.0 10267083      853.  8758855797.
 4 Afghanistan Asia       1967    34.0 11537966      836.  9648014150.
 5 Afghanistan Asia       1972    36.1 13079460      740.  9678553274.
 6 Afghanistan Asia       1977    38.4 14880372      786. 11697659231.
 7 Afghanistan Asia       1982    39.9 12881816      978. 12598563401.
 8 Afghanistan Asia       1987    40.8 13867957      852. 11820990309.
 9 Afghanistan Asia       1992    41.7 16317921      649. 10595901589.
10 Afghanistan Asia       1997    41.8 22227415      635. 14121995875.
# ℹ 1,694 more rows

Função arrange()

Função arrange()

Figura 1: Ordena as linhas pelos valores de uma variável em ordem crescente
Figura 2: Ordena as linhas pelos valores de uma variável em ordem decrescente

Exemplo 1

Ordem Crescente

  • Para ordenar a df segundo a expectativa de vida dos países do continente Americas no ano de 2007, em ordem crescente, podemos fazer:
gapminder %>%
  filter(continent == "Americas", year == 2007) %>%
  select(country, lifeExp) %>%
  arrange(lifeExp)
# A tibble: 25 × 2
   country             lifeExp
   <fct>                 <dbl>
 1 Haiti                  60.9
 2 Bolivia                65.6
 3 Trinidad and Tobago    69.8
 4 Honduras               70.2
 5 Guatemala              70.3
 6 Peru                   71.4
 7 Paraguay               71.8
 8 El Salvador            71.9
 9 Dominican Republic     72.2
10 Brazil                 72.4
# ℹ 15 more rows

Exemplo 2

Ordem Decrescente

  • Para ordenar a df segundo a expectativa de vida dos países do continente Americas no ano de 2007, em ordem Decrescente, podemos fazer:
gapminder %>%
  filter(continent == "Americas", year == 2007) %>%
  select(country, lifeExp) %>%
  arrange(desc(lifeExp))
# A tibble: 25 × 2
   country       lifeExp
   <fct>           <dbl>
 1 Canada           80.7
 2 Costa Rica       78.8
 3 Puerto Rico      78.7
 4 Chile            78.6
 5 Cuba             78.3
 6 United States    78.2
 7 Uruguay          76.4
 8 Mexico           76.2
 9 Panama           75.5
10 Argentina        75.3
# ℹ 15 more rows

Outras Funções Úteis do Pacote dplyr

Função count()

Count = Contar

  • Uma operação muito comum em ciência de dados é contar o número de observações de uma variável ou grupo.

  • A função count() é uma forma rápida de contar o número de ocorrências de valores únicos em uma variável (coluna).

  • Passamos a ela o nome de uma ou mais colunas que contêm os grupos em que estamos interessados,

  • E podemos, opcionalmente, classificar os resultados em ordem decrescente usando o argumento sort=TRUE:

Exemplo 1

Descrição

  • Por exemplo, se você quiser saber quantos anos de dados estão disponíveis para cada país, podemos fazer:
gapminder %>%
  count(country)
# A tibble: 142 × 2
   country         n
   <fct>       <int>
 1 Afghanistan    12
 2 Albania        12
 3 Algeria        12
 4 Angola         12
 5 Argentina      12
 6 Australia      12
 7 Austria        12
 8 Bahrain        12
 9 Bangladesh     12
10 Belgium        12
# ℹ 132 more rows

Exemplo 2

Descrição

  • E se você quiser saber quantos anos de dados estão disponíveis para cada continente?
gapminder %>%
  count(continent)
# A tibble: 5 × 2
  continent     n
  <fct>     <int>
1 Africa      624
2 Americas    300
3 Asia        396
4 Europe      360
5 Oceania      24

Exemplo 3

Descrição

Quantos países foram registrados no conjunto de dados gapminder em cada ano?

gapminder %>%
  count(year)
# A tibble: 12 × 2
    year     n
   <int> <int>
 1  1952   142
 2  1957   142
 3  1962   142
 4  1967   142
 5  1972   142
 6  1977   142
 7  1982   142
 8  1987   142
 9  1992   142
10  1997   142
11  2002   142
12  2007   142

Exemplo 4

Descrição

  • Quantos anos de observações sobre o Brasil estão presentes no conjunto de dados gapminder?
gapminder %>%
  filter(country == "Brazil") %>%
  count(country)
# A tibble: 1 × 2
  country     n
  <fct>   <int>
1 Brazil     12